using System;
using Server;
using Server.Gumps;
using Server.Multis;
using Server.Network;
using Server.Engines.VeteranRewards;

namespace Server.Items
{
    public class RewardBrazier : Item, IRewardItem
    {
        public override bool ForceShowProperties { get { return ObjectPropertyList.Enabled; } }

        private bool m_IsRewardItem;

        [CommandProperty(AccessLevel.GameMaster)]
        public bool IsRewardItem
        {
            get { return m_IsRewardItem; }
            set { m_IsRewardItem = value; InvalidateProperties(); }
        }

        private Item m_Fire;

        public override void OnDelete()
        {
            TurnOff();

            base.OnDelete();
        }

        private static int[] m_Art = new int[]
		{
			0x19AA, 0x19BB
		};

        [Constructable]
        public RewardBrazier(): this(Utility.RandomList(m_Art))
        {
        }

        [Constructable]
        public RewardBrazier(int itemID): base(itemID)
        {
            LootType = LootType.Blessed;
            Weight = 10.0;
        }

        public RewardBrazier(Serial serial): base(serial)
        {
        }

        public void TurnOff()
        {
            if (m_Fire != null)
            {
                m_Fire.Delete();
                m_Fire = null;
            }
        }

        public void TurnOn()
        {
            if (m_Fire == null)
                m_Fire = new Item();

            m_Fire.ItemID = 0x19AB;
            m_Fire.Movable = false;
            m_Fire.MoveToWorld(new Point3D(X, Y, Z + ItemData.Height + 2), Map);
        }

        public override void OnDoubleClick(Mobile from)
        {
            if (!from.InRange(this.GetWorldLocation(), 2))
            {
                from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
            }
            else if (IsLockedDown)
            {
                BaseHouse house = BaseHouse.FindHouseAt(from);

                if (house != null && house.IsCoOwner(from))
                {
                    if (m_Fire != null)
                        TurnOff();
                    else
                        TurnOn();
                }
                else
                    from.SendLocalizedMessage(502436); // That is not accessible.
            }
            else
                from.SendLocalizedMessage(502692); // This must be in a house and be locked down to work.
        }

        public override void OnLocationChange(Point3D old)
        {
            if (m_Fire != null)
                m_Fire.MoveToWorld(new Point3D(X, Y, Z + ItemData.Height), Map);
        }

        public override void GetProperties(ObjectPropertyList list)
        {
            base.GetProperties(list);

            if (m_IsRewardItem)
                list.Add(1076222); // 6th Year Veteran Reward
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.WriteEncodedInt(0); // version

            writer.Write((bool)m_IsRewardItem);
            writer.Write((Item)m_Fire);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadEncodedInt();

            m_IsRewardItem = reader.ReadBool();
            m_Fire = reader.ReadItem();
        }
    }

    public class RewardBrazierDeed : Item, IRewardItem
    {
        public override int LabelNumber { get { return 1080527; } } // Brazier Deed

        private bool m_IsRewardItem;

        [CommandProperty(AccessLevel.GameMaster)]
        public bool IsRewardItem
        {
            get { return m_IsRewardItem; }
            set { m_IsRewardItem = value; InvalidateProperties(); }
        }

        [Constructable]
        public RewardBrazierDeed(): base(0x14F0)
        {
            LootType = LootType.Blessed;
            Weight = 1.0;
        }

        public RewardBrazierDeed(Serial serial): base(serial)
        {
        }

        public override void OnDoubleClick(Mobile from)
        {
            if (m_IsRewardItem && !RewardSystem.CheckIsUsableBy(from, this, null))
                return;

            if (IsChildOf(from.Backpack))
            {
                from.CloseGump(typeof(InternalGump));
                from.SendGump(new InternalGump(this));
            }
            else
                from.SendLocalizedMessage(1042038); // You must have the object in your backpack to use it.
        }

        public override void GetProperties(ObjectPropertyList list)
        {
            base.GetProperties(list);

            if (m_IsRewardItem)
                list.Add(1076222); // 6th Year Veteran Reward
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.WriteEncodedInt(0); // version

            writer.Write((bool)m_IsRewardItem);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadEncodedInt();

            m_IsRewardItem = reader.ReadBool();
        }

        private class InternalGump : Gump
        {
            private RewardBrazierDeed m_Brazier;

            public InternalGump(RewardBrazierDeed brazier): base(100, 200)
            {
                m_Brazier = brazier;

                Closable = true;
                Disposable = true;
                Dragable = true;
                Resizable = false;

                AddPage(0);
                AddBackground(0, 0, 200, 200, 2600);

                AddPage(1);
                AddLabel(45, 15, 0, "Choose a Brazier:");

                AddItem(40, 75, 0x19AA);
                AddButton(55, 50, 0x845, 0x846, 0x19AA, GumpButtonType.Reply, 0);

                AddItem(100, 75, 0x19BB);
                AddButton(115, 50, 0x845, 0x846, 0x19BB, GumpButtonType.Reply, 0);
            }

            public override void OnResponse(NetState sender, RelayInfo info)
            {
                if (m_Brazier == null | m_Brazier.Deleted)
                    return;

                Mobile m = sender.Mobile;

                if (info.ButtonID == 0x19AA || info.ButtonID == 0x19BB)
                {
                    RewardBrazier brazier = new RewardBrazier(info.ButtonID);
                    brazier.IsRewardItem = m_Brazier.IsRewardItem;

                    if (!m.PlaceInBackpack(brazier))
                    {
                        brazier.Delete();
                        m.SendLocalizedMessage(1078837); // Your backpack is full! Please make room and try again.
                    }
                    else
                        m_Brazier.Delete();
                }
            }
        }
    }

	public class Brazier : BaseLight
	{
		public override int LitItemID{ get { return 0xE31; } }
		
		[Constructable]
		public Brazier() : base( 0xE31 )
		{
			Movable = false;
			Duration = TimeSpan.Zero; // Never burnt out
			Burning = true;
			Light = LightType.Circle225;
			Weight = 20.0;
		}

		public Brazier( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			writer.Write( (int) 0 );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );
			int version = reader.ReadInt();
		}
	}
}